package com.zf.classpath_file;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.StandardCharsets;

/**
 * 类路径下的文件读取: 文件被打成jar时，无法直接用 File 读取，需要特殊的方法才能读取
 */
public class ClassPathFileReadTest {
    public static void main(String[] args) throws IOException {
        /*
            使用 Class.getResource() 读取类路径下的文件: 名称必须要以 "/" 开头
                1、以 "/" 开头：会自动移除开头的 "/"， 如 "/cp/file/test.txt" 会变成 "cp/file/test.txt"，然后经过名称转换为包名后就变成了 < "cp.file" 和 "test.txt" > ，类路径下有这个包名和文件，可以读取到结果
                2、不以 "/" 开头：文件名会被添加 "class的包名/" 前缀， 如 "cp/file/test.txt" 会变成 "com/zf/classpath_file/cp/file/test.txt"，然后经过名称转换为包名后就变成了 < "com.zf.classpath_file.cp.file" 和 "test.txt" > ，类路径下没有这个包名，读取结果为null
         */
        Class<ClassPathFileReadTest> cpClass = ClassPathFileReadTest.class;
        URL resource1 = cpClass.getResource("cp/file/test.txt"); // null
        URL resource2 = cpClass.getResource("/cp/file/test.txt");
        System.out.println(resource1);
        InputStream inputStream1 = cpClass.getResourceAsStream("/cp/file/test.txt");
        System.out.println(resource2.getPath());
        System.out.println(new String(inputStream1.readAllBytes(), StandardCharsets.UTF_8));
        inputStream1.close();

        /*
            使用 ClassLoader.getResource() 读取类路径下的文件：名称不能以 "/" 开头
                1、不以 "/" 开头：如 "cp/file/test.txt" 经过名称转换为包名后就变成了 < "cp.file" 和 "test.txt" >，类路径下有这个包名和文件，可以读取到结果
                2、以 "/" 开头：如 "/cp/file/test.txt" 经过名称转换为包名后就变成了 < ".cp.file" 和 "test.txt" >，类路径下没有这个包名，读取结果为null
         */
        ClassLoader cpClassLoader = ClassPathFileReadTest.class.getClassLoader();
        URL resource3 = cpClassLoader.getResource("/cp/file/test.txt");// null
        URL resource4 = cpClassLoader.getResource("cp/file/test.txt");
        System.out.println(resource3);
        InputStream inputStream2 = cpClassLoader.getResourceAsStream("cp/file/test.txt");
        System.out.println(resource4.getPath());
        System.out.println(new String(inputStream2.readAllBytes(), StandardCharsets.UTF_8));
        inputStream2.close();

    }
}
